﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic
{
    public class TipoAplicacaoPolitica : BaseBusinessLogic
    {        
        #region Métodos

            #region AlterarTipoAplicacaoPolitica

                /// <summary>
                /// Altera os dados de um tipo de aplicação de política.
                /// </summary>
                /// <param name="tipoAplicacaoPolitica"></param>
                public void AlterarTipoAplicacaoPolitica(BusinessEntity.TipoAplicacaoPolitica tipoAplicacaoPolitica)
                {
                    if (tipoAplicacaoPolitica == null)
                        throw new BusinessException(109351);                     
                    else
                    {
                        this.ValidarTipoAplicacaoPolitica(tipoAplicacaoPolitica);

                        new ResourceAccess.TipoAplicacaoPolitica().AlterarTipoAplicacaoPolitica(tipoAplicacaoPolitica);
                    }
                }
            
            #endregion

            #region AlterarTipoAplicacaoPoliticas

                /// <summary>
                /// Alterar uma lista de tipos de aplicação de política.
                /// </summary>
                /// <param name="tipoAplicacaoPoliticas"></param>
                public void AlterarTipoAplicacaoPoliticas(List<BusinessEntity.TipoAplicacaoPolitica> tipoAplicacaoPoliticas)
                {
                    foreach (BusinessEntity.TipoAplicacaoPolitica tipoAplicacaoPolitica in tipoAplicacaoPoliticas)
                    {
                        this.AlterarTipoAplicacaoPolitica(tipoAplicacaoPolitica);
                    }
                }
            
            #endregion

            #region ConsultarTipoAplicacaoPolitica

                /// <summary>
                /// Obtem uma lista de tipos aplicação política existente na base de dados.
                /// </summary>
                public List<BusinessEntity.TipoAplicacaoPolitica> ConsultarTipoAplicacaoPolitica(BusinessEntity.Parameter.FiltroTipoAplicacaoPolitica filtroTipoAplicacaoPolitica)
                {
                    if (filtroTipoAplicacaoPolitica == null)
                        throw new BusinessException(109351);    
                    else 
                        return new ResourceAccess.TipoAplicacaoPolitica().ConsultarTipoAplicacaoPolitica(filtroTipoAplicacaoPolitica);
                }
            
            #endregion

            #region ExcluirTipoAplicacaoPolitica

                /// <summary>
                /// Exclui um tipo de aplicação de política.
                /// </summary>
                /// <param name="filtroTipoAplicacaoPoliticaChave"></param>
                public void ExcluirTipoAplicacaoPolitica(BusinessEntity.Parameter.FiltroTipoAplicacaoPoliticaChave filtroTipoAplicacaoPoliticaChave)
                {
                    if (filtroTipoAplicacaoPoliticaChave == null)
                        throw new BusinessException(109351);
                    
                    if (this.VerificarDependenciaPolitica(filtroTipoAplicacaoPoliticaChave))
                        throw new BusinessException(109406);

                    new ResourceAccess.TipoAplicacaoPolitica().ExcluirTipoAplicacaoPolitica(filtroTipoAplicacaoPoliticaChave);
                }
            
            #endregion

            #region ExcluirTipoAplicacaoPoliticas

                /// <summary>
                /// Exclui uma lista de tipos de aplicação de política.
                /// </summary>
                /// <param name="filtroTipoAplicacaoPoliticaChaves"></param>
                public void ExcluirTipoAplicacaoPoliticas(List<BusinessEntity.Parameter.FiltroTipoAplicacaoPoliticaChave> filtroTipoAplicacaoPoliticaChaves)
                {
                    foreach (BusinessEntity.Parameter.FiltroTipoAplicacaoPoliticaChave filtroTipoAplicacaoPoliticaChave in filtroTipoAplicacaoPoliticaChaves)
                    {
                        this.ExcluirTipoAplicacaoPolitica(filtroTipoAplicacaoPoliticaChave);
                    }
                }
            
            #endregion

            #region IncluirTipoAplicacaoPolitica

                /// <summary>
                /// Inclui um novo tipo de aplicação de politica.
                /// </summary>
                /// <param name="tipoAplicacaoPolitica"></param>
                public void IncluirTipoAplicacaoPolitica(BusinessEntity.TipoAplicacaoPolitica tipoAplicacaoPolitica)
                {
                    if (tipoAplicacaoPolitica == null)
                        throw new BusinessException(109351);
                    else
                    {
                        this.ValidarTipoAplicacaoPolitica(tipoAplicacaoPolitica);

                        BusinessEntity.Parameter.FiltroTipoAplicacaoPolitica filtro = new BusinessEntity.Parameter.FiltroTipoAplicacaoPolitica();
                        filtro.Codigo = tipoAplicacaoPolitica.Codigo;
                        filtro.Descricao = string.Empty;

                        if (this.VerificarDuplicidadeCodigo(filtro))
                            throw new BusinessException(109485);                        

                        new ResourceAccess.TipoAplicacaoPolitica().IncluirTipoAplicacaoPolitica(tipoAplicacaoPolitica);
                    }                      
                }
            
            #endregion

            #region IncluirTipoAplicacaoPoliticas

                /// <summary>
                /// Inclui uma lista de tipos de aplicação de política.
                /// </summary>
                /// <param name="tipoAplicacaoPoliticas"></param>
                public void IncluirTipoAplicacaoPoliticas(List<BusinessEntity.TipoAplicacaoPolitica> tipoAplicacaoPoliticas)
                {
                    foreach (BusinessEntity.TipoAplicacaoPolitica tipoAplicacaoPolitica in tipoAplicacaoPoliticas)
                    {
                        this.IncluirTipoAplicacaoPolitica(tipoAplicacaoPolitica); 
                    }
                }
            
            #endregion

            #region ValidarTipoAplicacaoPolitica

                /// <summary>
                /// Validar Alteracao Tipo Aplicacao Politica
                /// </summary>
                /// <param name="tipoAplicacaoPolitica"></param>
                private void ValidarTipoAplicacaoPolitica(BusinessEntity.TipoAplicacaoPolitica tipoAplicacaoPolitica)
                {
                    SinacorValidation validar = new SinacorValidation();
                    validar.AddValidation<BusinessEntity.TipoAplicacaoPolitica>(tipoAplicacaoPolitica);
                    validar.Validate();
                    validar = null;

                    BusinessEntity.Parameter.FiltroTipoAplicacaoPolitica filtroTipoAplicacaoPolitica = new BusinessEntity.Parameter.FiltroTipoAplicacaoPolitica();
                    filtroTipoAplicacaoPolitica.Descricao = tipoAplicacaoPolitica.Descricao;
                    filtroTipoAplicacaoPolitica.Codigo = null;

                    if (this.VerificarDuplicidadeDescricao(filtroTipoAplicacaoPolitica))
                        throw new BusinessException(109484);
                }

            #endregion

            #region ValidarDuplicidadeDescricao

                /// <summary>
                /// Método usado para Validar a Existencia da Descricao do Tipo de Avaliacao de Politica
                /// </summary>
                /// <param name="tipoAplicacaoPolitica"></param>
                private bool VerificarDuplicidadeDescricao(BusinessEntity.Parameter.FiltroTipoAplicacaoPolitica filtroTipoAplicacaoPolitica)
                {
                    bool retorno;

                    List<BusinessEntity.TipoAplicacaoPolitica> tipoAplicacoes = this.ConsultarTipoAplicacaoPolitica(filtroTipoAplicacaoPolitica);

                    if (tipoAplicacoes.Count > 0)
                        retorno = true;
                    else
                        retorno = false;   

                    return retorno;
                }

            #endregion

            #region ObterTipoAplicacaoPolitica

                /// <summary>
                /// Obtem um único Tipo Aplicacao Política a partir de seu código.
                /// </summary>
                /// <param name="filtroTipoAplicacaoPolitica"></param>
                public BusinessEntity.TipoAplicacaoPolitica ObterTipoAplicacaoPolitica(BusinessEntity.Parameter.FiltroTipoAplicacaoPoliticaChave filtroTipoAplicacaoPoliticaChave)
                {
                    if (filtroTipoAplicacaoPoliticaChave == null)
                        throw new BusinessException(109351); 
                    else
                        return new ResourceAccess.TipoAplicacaoPolitica().ObterTipoAplicacaoPolitica(filtroTipoAplicacaoPoliticaChave);
                }
            
            #endregion

            #region VerificarDependenciaPolitica

                /// <summary>
                /// Valida e o código do tipo de aplicação de política já está em uso em uma
                /// Politica.
                /// </summary>
                /// <param name="filtroTipoAplicacaoPoliticaChave"></param>
                private bool VerificarDependenciaPolitica(BusinessEntity.Parameter.FiltroTipoAplicacaoPoliticaChave filtroTipoAplicacaoPoliticaChave)
                {
                    return new ResourceAccess.TipoAplicacaoPolitica().ValidarDependenciaPolitica(filtroTipoAplicacaoPoliticaChave);
                }
            
            #endregion          

            #region ValidarDuplicidadeCodigo

                /// <summary>
                /// Validar Existencia Codigo Tipo Aplicacao Politica
                /// </summary>
                /// <param name="tipoAplicacaoPolitica"></param>
                private bool VerificarDuplicidadeCodigo(BusinessEntity.Parameter.FiltroTipoAplicacaoPolitica filtroTipoAplicacaoPolitica)
                {
                    bool retorno;

                    List<BusinessEntity.TipoAplicacaoPolitica> tipoAplicacoes = this.ConsultarTipoAplicacaoPolitica(filtroTipoAplicacaoPolitica);

                    if (tipoAplicacoes.Count > 0)
                        retorno = true;
                    else
                        retorno = false;                   

                    return retorno;
                }
            
            #endregion

        #endregion		
	}
}